package org.finesys.common.sensitive.core.util;

import org.apache.commons.lang3.StringUtils;

/**
 * 日志打印内容敏感信息处理
 */
@SuppressWarnings("all")
public class SensitiveInfoConvertUtil {

    private static final int START = 6;

    private static final int END = 4;

    /**
     * 中文名脱敏
     *
     * @param fullName real name
     * @return 脱敏后数据
     */
    public static String chineseName(String fullName) {
        if (StringUtils.isBlank(fullName)) {
            return "";
        }
        String name = StringUtils.left(fullName.replaceAll("'", ""), 1);
        return StringUtils.rightPad(name, StringUtils.length(fullName.replaceAll("'", "")), "*");
    }

    /**
     * 显示前三位最后两位，其他隐藏。共计18位或者15位
     * ?= exp1(?=exp2)：查找 exp2 前面的 exp1
     * ?<= (?<=exp2)exp1：查找 exp2 后面的 exp1。
     * ?! exp1(?!exp2)：查找后面不是 exp2 的 exp1。
     * ?<! (?<!exp2)exp1：查找前面不是 exp2 的 exp1
     *
     * @param idCardNum 身份证
     * @return 脱敏后数据
     */
    public static String idCardNum(String idCardNum) {
        if (StringUtils.isBlank(idCardNum)) {
            return "";
        }
        return idCardNum.replaceAll("(?<=\\w{3})\\w(?=\\w{2})", "*");
    }

    /**
     * 前三位，后四位，其他隐藏
     *
     * @param num 电话号码
     * @return 脱敏后数据
     */
    public static String mobilePhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return num.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 前六位，后四位，其他用星号隐藏每位1个星号
     *
     * @param cardNum 银行卡号
     * @return 脱敏后数据
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, START)
                .concat(StringUtils
                        .removeStart(StringUtils
                                .leftPad(StringUtils
                                                .right(cardNum, END),
                                        StringUtils.length(cardNum), "*"), "******"));
    }

    /**
     * macKey脱敏
     *
     * @param mac 鉴权值
     * @return 脱敏后数据
     */
    public static String macKey(String mac) {
        if (StringUtils.isEmpty(mac)) {
            return "";
        }
        return mac.replaceAll("(?<=\\w{3})\\w(?=\\w{4})", "*");
    }
}
